package cn.it.xiaohan.note.dao;

import cn.hutool.core.util.StrUtil;
import cn.it.xiaohan.note.po.Note;
import cn.it.xiaohan.note.vo.NoteVo;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

public class NoteDao {

    /**
     * 添加或者修改，返回受影响的函数
     * @param typeId
     * @param title
     * @param content
     * @return
     */
    public int addOrUpdate(String typeId, String title, String content,String noteId,String lon, String lat) {
        // 定义sql语句
        String sql = "";
        // 设置参数
        List<Object> params = new ArrayList<>();
        params.add(typeId);
        params.add(title);
        params.add(content);

        // 判断我们的noteId是否为空:如果为空则为添加操作；如果不为空，则为修改操作
        if (StrUtil.isBlank(noteId)){ // 添加操作
            sql = "insert into tb_note (typeId, title, content, pubTime, lon, lat) values (?,?,?,now(),?,?)";
            params.add(lon);
            params.add(lat);
        } else { // 修改操作
            sql = "update tb_note set typeId = ?, title = ?, content = ? where noteId = ?";
            params.add(noteId);
        }

        // 调用BaseDao更新方法，返回受影响的行数
        int row = BaseDao.executeUpdate(sql,params);
        return row;
    }

    /**
     * 查询当前登录用户的云记数量，返回总记录数
     * @param userId
     * @return
     */
    public long findNoteCount(Integer userId, String title, String date, String typeId) {
        // 定义sql语句
        String sql = "select count(1) from tb_note n join tb_note_type t on n.typeId = t.typeId where userId = ?";

        // 设置参数集合
        List<Object> params = new ArrayList<>();
        params.add(userId);

        // 判断条件查询的参数是否为空
        if (!StrUtil.isBlank(title)){
            // 如果查询参数不为空，则拼接sql语句，并设置所需要的参数
            sql += " and title like concat('%',?,'%')";
            // 设置sql语句所需要的参数
            params.add(title);
        } else if (!StrUtil.isBlank(date)){
            // 如果查询参数不为空，则拼接sql语句，并设置所需要的参数
            sql += " and date_format(pubTime,'%Y年%m月') = ?";
            // 设置sql语句所需要的参数
            params.add(date);
        } else if (!StrUtil.isBlank(typeId)){
            // 如果查询参数不为空，则拼接sql语句，并设置所需要的参数
            sql += " and n.typeId = ?";
            // 设置sql语句所需要的参数
            params.add(typeId);
        }

        // 调用BaseDao方法，返回数量
        long count = (long) BaseDao.findSingleValue(sql,params);
        return count;
    }

    /**
     * 分页查询云记列表
     * @param userId
     * @param index
     * @param pageSize
     * @return
     */
    public List<Note> findNoteListByPage(Integer userId, Integer index, Integer pageSize, String title, String date, String typeId) {
        // 定义sql语句
        String sql = "select noteId,title,pubTime from tb_note n join tb_note_type t on n.typeId = t.typeId where userId = ?";
        // 设置参数集合
        List<Object> params = new ArrayList<>();
        params.add(userId);

        // 判断标题是否为空
        if (!StrUtil.isBlank(title)){
            sql += " and title like concat('%',?,'%')";
            params.add(title);
        }else if (!StrUtil.isBlank(date)){
            // 如果查询参数不为空，则拼接sql语句，并设置所需要的参数
            sql += " and date_format(pubTime,'%Y年%m月') = ?";
            // 设置sql语句所需要的参数
            params.add(date);
        } else if (!StrUtil.isBlank(typeId)){
            // 如果查询参数不为空，则拼接sql语句，并设置所需要的参数
            sql += " and n.typeId = ?";
            // 设置sql语句所需要的参数
            params.add(typeId);
        }

        // 拼接分页的sql语句
        sql += " order by pubTime desc limit ?,?";

        params.add(index);
        params.add(pageSize);

        // 调用BaseDao方法 返回note集合
        List<Note> noteList = BaseDao.queryRows(sql,params,Note.class);
        return noteList;
    }

    /**
     * 通过日期分组查询当前登录用户下的云记数量
     * @param userId
     * @return
     */
    public List<NoteVo> findNoteCountByDate(Integer userId) {
        // 定义sql语句
        String sql = "select count(1) noteCount,date_format(pubTime,'%Y年%m月') groupName from tb_note n" +
                " join tb_note_type t on n.typeId = t.typeId where userId = ?" +
                " group by date_format(pubTime,'%Y年%m月')" +
                " order by date_format(pubTime,'%Y年%m月') desc";

        // 设置参数
        List<Object> params = new ArrayList<>();
        params.add(userId);

        // 调用BaseDao的查询方法
        List<NoteVo> list = BaseDao.queryRows(sql,params,NoteVo.class);
        return list;
    }

    /**
     * 通过类型分组查询当前登录用户下的云记数量
     * @param userId
     * @return
     */
    public List<NoteVo> findNoteCountByType(Integer userId) {
        // 定义sql语句
        String sql = "select count(noteId) noteCount, t.typeId, typeName groupName from tb_note n" +
                " right join tb_note_type t on n.typeId = t.typeId where userId = ?" +
                " group by t.typeId order by count(noteId) desc";

        // 设置参数
        List<Object> params = new ArrayList<>();
        params.add(userId);

        // 调用BaseDao的查询方法
        List<NoteVo> list = BaseDao.queryRows(sql,params,NoteVo.class);
        return list;
    }

    /**
     * 通过id查询云记对象
     * @param noteId
     * @return
     */
    public Note findNoteById(String noteId) {
        // 定义sql语句
        String sql = "select noteId,title,content,pubTime,typeName,n.typeId from tb_note n" +
                " join tb_note_type t on n.typeId = t.typeId where noteId = ?";
        // 设置参数集合
        List<Object> params = new ArrayList<>();
        params.add(noteId);
        //调用BaseDao的查询方法返回note对象
        Note note = (Note) BaseDao.queryRow(sql,params,Note.class);
        // 返回note对象
        return note;
    }

    public int deleteNote(String noteId) {
        // 定义sql语句
        String sql = "delete from tb_note where noteId = ?";

        // 设置参数集合
        List<Object> params = new ArrayList<>();
        params.add(noteId);

        // 调用BaseDao的更新方法，返回受影响的行数
        int row = BaseDao.executeUpdate(sql,params);

        return row;
    }

    /**
     * 查询云记发布时的坐标
     * @param userId
     * @return
     */
    public List<Note> findNoteByLonAndLat(Integer userId) {
        // 定义sql语句
        String sql = "select lon, lat from tb_note n join tb_note_type t on n.typeId = t.typeId where userId = ?";

        // 设置参数
        List<Object> params = new ArrayList<>();
        params.add(userId);

        // 调用BaseDao的方法返回集合对象
        List<Note> noteList = BaseDao.queryRows(sql,params,Note.class);
        return noteList;
    }
}
